const userModel = require("../models/userModel");
const JWT = require("../utils/jwtUtil");

/* 处理注册 */
async function register(username, password) {
  /* 查看用户名是否存在 存在则注册失败 */
  const users = await userModel.getUsers({ username });
  if (users.length) {
    // 履约数据
    return { msg: "注册失败", reason: "用户名已存在" };
  }

  /* 调用模型层的添加用户方法 得到添加的结果 */
  const result = await userModel.addUser({ username, password });

  // 将结果丢还视图层
  return result;
}

/* 处理登录 */
async function login(username, password) {
  // 死等模型层查询用户的结果
  const users = await userModel.getUsers({ username, password });

  /* 只要查询结果不为空数组 即为登录成功 */
  if (users.length) {
    /* 发放Token */
    const token = JWT.generate(users[0]);

    // 向后继续履约
    return { msg: "登录成功", token };
  } else {
    // 向后继续履约
    return { msg: "登录失败", reason: "查无此人" };
  }
}

/* 处理个人中心请求 */
async function getUserDetail(id) {
  const users = await userModel.getUsers({ _id: id });
  if (users.length) {
    return users[0];
  } else {
    return { msg: "查无此人" };
  }
}

/* 修改用户信息 */
async function updateUser0(id, user) {
  const result = await userModel.updateUser(id, user);
  // await左后方的全部代码都相当于是promise的then回调
  // return 数据相当于履约
  // 向视图层返回数据
  return result;
}

/* 【上传头像+修改信息】 */
const fs = require("fs");
const path = require("path");
const { uploadPath } = require("../config");

/* 【上传头像+修改信息】并发版 */
async function updateUser1(id, req) {
  /* 接收上传的文件 */
  const p1 = new Promise((resolve, reject) => {
    fs.readFile(req.files[0].path, (err, data) => {
      if (err) {
        resolve({
          msg: "文件读取失败",
          err,
        });
      } else {
        /* 如果读取成功，将其写入upload目录下 */
        fs.writeFile(
          path.join(uploadPath, req.files[0].filename),
          data,
          (err) =>
            resolve({
              err,
              msg: err ? "文件写出失败" : "文件写出成功",
            })
        );
      }
    });
  });

  /* 接收用户提交的请求体 + 修改用户名密码 */
  const p2 = userModel.updateUser(id, {
    ...req.body,
    avatar: `/upload/${req.files[0].filename}`,
  });

  /* 两个Promise都成功即为成功 */
  return Promise.all([p1, p2]);
}

/* 【上传头像+修改信息】同步版 */
async function updateUser2(id, req) {
  /* 接收上传的文件 */
  return new Promise((resolve, reject) => {
    fs.readFile(req.files[0].path, (err, data) => {
      if (err) {
        resolve({
          msg: "文件读取失败",
          err,
        });
      } else {
        /* 如果读取成功，将其写入upload目录下 */
        fs.writeFile(
          path.join(uploadPath, req.files[0].filename),
          data,
          (err) =>
            resolve({
              err,
              msg: err ? "文件写出失败" : "文件写出成功",
            })
        );
      }
    });
  })
  
  .then(async ({ err, msg }) => {
    if (!err) {
      // 上传成功后 更新用户信息
      const result = await userModel.updateUser(id, {
        ...req.body,
        avatar: `/upload/${req.files[0].filename}`,
      });

      // 在then/catch/finally回调中没有resolve和reject可用
      // 要么return value/Promise
      // 要么throw Error
      return result;
    } else {
      // 上传失败 直接返回失败信息
      return { err, msg };
    }
  });

}

module.exports = {
  register,
  login,
  getUserDetail,
  updateUser0,
  updateUser1,
  updateUser2,
};
